import { KeyCodeControlMessage } from '../controlMessage/KeyCodeControlMessage';
import KeyEvent from './android/KeyEvent';
import { KeyToCodeMap } from './KeyToCodeMap';

export interface KeyEventListener {
	onKeyEvent : (event : KeyCodeControlMessage) => void;
}

export class KeyInputHandler {
	private static readonly listeners : Set<KeyEventListener> = new Set();
	private static isWebSocketEnabled : boolean = true;
	private static isShiftPressed : boolean = false;

	// 添加字符到 keyCode 的映射

	private static CharToKeyCodeMap = new Map([
		// 字母
		['a', 29], ['b', 30], ['c', 31], ['d', 32], ['e', 33],
		['f', 34], ['g', 35], ['h', 36], ['i', 37], ['j', 38],
		['k', 39], ['l', 40], ['m', 41], ['n', 42], ['o', 43],
		['p', 44], ['q', 45], ['r', 46], ['s', 47], ['t', 48],
		['u', 49], ['v', 50], ['w', 51], ['x', 52], ['y', 53], ['z', 54],

		// 数字
		['0', 7], ['1', 8], ['2', 9], ['3', 10], ['4', 11],
		['5', 12], ['6', 13], ['7', 14], ['8', 15], ['9', 16],

		// 基础符号（不需要Shift）
		[' ', 62],    // 空格
		['`', 68],    // ` 
		['-', 69],    // -
		['=', 70],    // =
		['[', 71],    // [
		[']', 72],    // ]
		['\\', 73],   // \
		[';', 74],    // ;
		["'", 75],    // '
		[',', 55],    // ,
		['.', 56],    // .
		['/', 57],    // /

		// 特殊符号（需要Shift，使用基础键的keyCode）
		['!', 8],     // 使用数字1的keyCode + Shift
		['@', 9],     // 使用数字2的keyCode + Shift  
		['#', 10],    // 使用数字3的keyCode + Shift
		['$', 11],    // 使用数字4的keyCode + Shift
		['%', 12],    // 使用数字5的keyCode + Shift
		['^', 13],    // 使用数字6的keyCode + Shift
		['&', 14],    // 使用数字7的keyCode + Shift
		['*', 15],    // 使用数字8的keyCode + Shift
		['(', 16],    // 使用数字9的keyCode + Shift
		[')', 7],     // 使用数字0的keyCode + Shift
		['_', 69],    // 使用减号的keyCode + Shift
		['+', 70],    // 使用等号的keyCode + Shift
		['{', 71],    // 使用左括号的keyCode + Shift
		['}', 72],    // 使用右括号的keyCode + Shift
		['|', 73],    // 使用反斜杠的keyCode + Shift
		[':', 74],    // 使用分号的keyCode + Shift
		['"', 75],    // 使用引号的keyCode + Shift
		['<', 55],    // 使用逗号的keyCode + Shift
		['>', 56],    // 使用句号的keyCode + Shift
		['?', 57],    // 使用斜杠的keyCode + Shift
		['~', 68],    // 使用反引号的keyCode + Shift
	]);
	// 原有的 KeyToCodeMap 保持不变...
	private static KeyToCodeMap = new Map([
		// 字母键（A-Z）
		["KeyA", 29], ["KeyB", 30], ["KeyC", 31], ["KeyD", 32], ["KeyE", 33],
		["KeyF", 34], ["KeyG", 35], ["KeyH", 36], ["KeyI", 37], ["KeyJ", 38],
		["KeyK", 39], ["KeyL", 40], ["KeyM", 41], ["KeyN", 42], ["KeyO", 43],
		["KeyP", 44], ["KeyQ", 45], ["KeyR", 46], ["KeyS", 47], ["KeyT", 48],
		["KeyU", 49], ["KeyV", 50], ["KeyW", 51], ["KeyX", 52], ["KeyY", 53], ["KeyZ", 54],

		// 数字键（主键盘）
		["Digit0", 7], ["Digit1", 8], ["Digit2", 9], ["Digit3", 10], ["Digit4", 11],
		["Digit5", 12], ["Digit6", 13], ["Digit7", 14], ["Digit8", 15], ["Digit9", 16],

		// 数字键（小键盘）
		["Numpad0", 144], ["Numpad1", 145], ["Numpad2", 146], ["Numpad3", 147], ["Numpad4", 148],
		["Numpad5", 149], ["Numpad6", 150], ["Numpad7", 151], ["Numpad8", 152], ["Numpad9", 153],
		["NumpadAdd", 157], ["NumpadSubtract", 156], ["NumpadMultiply", 155], ["NumpadDivide", 154],
		["NumpadEnter", 160], ["NumpadDecimal", 158],

		// 符号键
		["Backquote", 68],    // ` ~
		["Minus", 69],        // - _
		["Equal", 70],        // = +
		["BracketLeft", 71],  // [ {
		["BracketRight", 72], // ] }
		["Backslash", 73],    // \ |
		["Semicolon", 74],    // ; :
		["Quote", 75],        // ' "
		["Comma", 55],        // , <
		["Period", 56],       // . >
		["Slash", 57],        // / ?

		// 功能键（F1-F12）
		["F1", 131], ["F2", 132], ["F3", 133], ["F4", 134], ["F5", 135],
		["F6", 136], ["F7", 137], ["F8", 138], ["F9", 139], ["F10", 140], ["F11", 141], ["F12", 142],

		// 控制键
		["Backspace", 67],    // 退格
		["Tab", 61],          // Tab
		["Enter", 66],        // 回车
		["ShiftLeft", 59],    // 左Shift
		["ShiftRight", 60],   // 右Shift
		["ControlLeft", 129], // 左Ctrl
		["ControlRight", 130],// 右Ctrl
		["AltLeft", 57],      // 左Alt（Menu键）
		["AltRight", 58],     // 右Alt
		["CapsLock", 115],    // 大小写锁定
		["Escape", 111],      // Esc
		["Space", 62],        // 空格

		// 方向键
		["ArrowUp", 19],      // 上
		["ArrowDown", 20],    // 下
		["ArrowLeft", 21],    // 左
		["ArrowRight", 22],   // 右

		// 其他键
		["Insert", 124],      // Insert
		["Delete", 112],      // Delete
		["Home", 3],          // Home
		["End", 12],          // End
		["PageUp", 92],       // PageUp
		["PageDown", 93],     // PageDown
		["ScrollLock", 116],  // ScrollLock
		["Pause", 121],       // Pause
	]);

	// 特殊字符列表（需要Shift修饰）
	private static specialChars = [
		'!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
		'_', '+', '{', '}', '|', ':', '"', '<', '>', '?', '~'
	];
	// 修改 sendCharacter 方法
	public static sendCharacter(char : string) : void {
		if (!this.isWebSocketEnabled) return;
		const keyCode = this.CharToKeyCodeMap.get(char);
		if (!keyCode) {
			return;
		}
		// 判断是否需要Shift（大写字母或特殊符号）
		const needsShift = this.needsShiftModifier(char);
		const metaState = needsShift ? 1 : 0;
		// 发送按下和释放事件
		const downMessage = new KeyCodeControlMessage(
			KeyEvent.ACTION_DOWN,
			keyCode,
			0,
			metaState
		);

		const upMessage = new KeyCodeControlMessage(
			KeyEvent.ACTION_UP,
			keyCode,
			0,
			metaState
		);

		this.listeners.forEach(listener => {
			listener.onKeyEvent(downMessage);
			listener.onKeyEvent(upMessage);
		});
	}

	// 改进的Shift判断逻辑
	private static needsShiftModifier(char : string) : boolean {
		// 大写字母需要Shift
		if (char >= 'A' && char <= 'Z') {
			return true;
		}

		// 特殊符号需要Shift
		if (this.specialChars.includes(char)) {
			return true;
		}

		return false;
	}
	// 原有的其他方法保持不变...
	public static setWebSocketEnabled(enabled : boolean) : void {
		this.isWebSocketEnabled = enabled;
	}
	public static sendBackspaceKey() : void {
		if (!this.isWebSocketEnabled) return;
		const keyCode = this.KeyToCodeMap.get('Backspace');
		if (keyCode) {
			const downMessage = new KeyCodeControlMessage(
				KeyEvent.ACTION_DOWN,
				keyCode,
				0,
				0
			);
			const upMessage = new KeyCodeControlMessage(
				KeyEvent.ACTION_UP,
				keyCode,
				0,
				0
			);

			this.listeners.forEach(listener => {
				listener.onKeyEvent(downMessage);
				listener.onKeyEvent(upMessage);
			});
		}
	}

	public static sendKeyEvent(code : string, action : 'down' | 'up', metaState : number) : void {
		if (!this.isWebSocketEnabled) return;

		const keyCode = this.KeyToCodeMap.get(code);
		if (!keyCode) return;

		const actionCode = action === 'down' ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP;
		const controlMessage = new KeyCodeControlMessage(
			actionCode,
			keyCode,
			0,
			metaState
		);

		this.listeners.forEach(listener => listener.onKeyEvent(controlMessage));
	}

	public static addEventListener(listener : KeyEventListener) : void {
		this.listeners.add(listener);
	}

	public static removeEventListener(listener : KeyEventListener) : void {
		this.listeners.delete(listener);
	}
}